import type { AxiosRequestConfig, InternalAxiosRequestConfig, AxiosResponse, AxiosInstance, AxiosError } from 'axios';

/**
 *  axios实例配置选项，继承AxiosRequestConfig
 */

export interface AxiosOptions extends AxiosRequestConfig {
	/**
	 *  @description 是否直接返回data数据
	 */
	directlyGetData?: boolean;
	/**
	 *  @description 定义拦截器
	 */
	interceptors?: RequestInterceptors;
	/**
	 *  @description 是否取消重复请求
	 */
	abortRepetitiveRequest?: boolean;
	/**
	 *  @description 是否开启缓存
	 */
	cache?: boolean;
	/**
	 * 是否可以重连
	 */
	retry?: boolean;
	/**
	 *  @description 重连配置
	 */
	retryConfig?: {
		// 重连次数
		count: number;
		// 每次请求间隔时间
		waitTime: number;
	};
}

/**
 *  定义拦截器抽象类，后续在index.ts文件中继承实现
 */
export abstract class RequestInterceptors {
	// 请求拦截器
	abstract requestInterceptors?: (config: InternalAxiosRequestConfig) => InternalAxiosRequestConfig | Promise<any>;
	// 请求错误拦截器
	abstract requestInterceptorsCatch: (err: Error) => Error;
	// 响应拦截器
	abstract responseInterceptor?: (res: AxiosResponse) => AxiosResponse;
	// 响应错误拦截器
	abstract responseInterceptorsCatch?: (axiosInstance: AxiosInstance, error: AxiosCustomError) => void;
}

/**
 * 自定义config类型，继承AxiosRequestConfig
 */
export interface InternalAxiosRequestCustomConfig extends InternalAxiosRequestConfig {
	retry?: boolean;
	cache?: boolean;
}

export interface AxiosCustomRequestConfig extends AxiosRequestConfig {
	retry?: boolean;
	cache?: boolean;
}

/**
 * error 类型
 */
export interface AxiosCustomError extends AxiosError {
	cached?: boolean;
	key?: string;
}

/**
 *  定义返回类型，根据后台接口约定，可自行定义
 */
export interface Respones<T = any> {
	code: number;
	data: T;
	message: string;
}
